學過 Kubernetes 但對 Istio 不熟悉的人,應該會對 Virtual Service 以及 Destination Rule 等新名詞感到陌生,其實它們是 Kubernetes 的 CRD(Custom Resource Definition),作為 Istio 實現流量管理的關鍵,本篇就會來介紹 Virtual Service 以及 Destination Rule 到底是什麼,以及我們該如何去配置。
可以先從一個簡單例子開始說起,前面有提到 Istio 的基本功能為流量管理,如何實現就是靠 Virtual Service 及 Destination Rule, Virtual Service 會定義流量要如何走,Destination Rule 則定義目的地為何,藉由這兩個元件的相互配合,就能定義好流量要怎麼送、傳哪邊等規則。
以此圖來說,Virtual Service 會定義 90% 流量要往 v1,10% 流量轉往 v2 ,而 Destination Rule 則定義 v1、v2 究竟包含哪些 Pod
接下來我們就透過實際的 yaml 檔案,來更清楚了解整個過程吧!
Destionation Rule 是用來定義哪些集合裡存在哪些 Pod ,概念就如同 Service 的 Label Selector,設定好 Pod 的哪些 Label 對應到哪個集合,就能將 Pod 分群分類。我們以 前一章 使用到的 destination-rule.yaml 檔案當例子
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
將 yaml 檔案拆解來看
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
metadata.name
定義 DestinationRule 名稱
spec:
host: reviews
spec.host
定義要將 Reviews Service 的流量做分群
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
spec.subsets
定義群組名稱,以及選擇條件
如 v1 群組會將 Label 設為version: v1
的 Pod 加入群組
DestinationRule 除了分群分類,還有包括 LoadBalancer 與 ConnectionPool 等額外設定,能對群組內的流量做更細部的控管。
Virtual Service 是用來設置流量的路由規則,能做到的規則有很多種,我們以 前一章 使用到的 virtual_service.yaml 檔案當例子
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
將 yaml 檔案拆解來看
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
metadata.name
定義 VirtualService 名稱
spec:
hosts:
- reviews
spec.host
定義要對 Reviews Service 流量設置規則
http:
- route:
- destination:
host: reviews
subset: v2
流量規則為將所有流量都轉到 reviews Service 底下的 v2
這裡的 v2 指的是 DestinationRule 設置的群組
Virtual Service 還能下達各式各樣的路由規則,下面就舉一些常用的例子。
http:
- match:
- uri:
prefix: "/hello"
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
若 Http prefix 為
/hello
時將流量送至 v2,反之則送至 v1
http:
- route:
- destination:
host: reviews
subset: v2
weight: 25
- destination:
host: reviews
subset: v1
weight: 75
25% 流量送至 v2,75% 流量送至 v1
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v3
在 Header 有設置
end-user: jason
時會將流量導入 v2,反之則會導入 v3
本章了解完 Virtual Service 與 Destination Rule 後,之後的章節就會來實現 Istio 可以做到部署策略如 Canary 及 A/B Testing。